/****************************************************
 * 
 * home soft 版权所有.
 * 
 *****************************************************/

package com.homesoft.runtime.metadata.modle.entity;

import com.homesoft.runtime.metadata.modle.IMetadataEngineAware;
import com.homesoft.runtime.metadata.modle.IRootMetadataObject;
import com.homesoft.runtime.metadata.modle.MetadataList;

/**
 * @author lihg
 * @data   2012-9-15
 */
public interface IEntityInfo extends IRootMetadataObject, IMetadataEngineAware {

	/**
	 * 获取逻辑键信息
	 */
      EntityKeyInfo getEntityKey();// { get; set; }
      /**
       * 设置逻辑键信息
       */
      void setEntityKey(IEntityKeyInfo entityKey);

      /// <summary>
      /// 获取或设置实体唯一的短名称标识，抽象继承的时候使用
      /// </summary>
      /**
       * 获取实体唯一的短名称标识，抽象继承的时候使用
       */
      String getTypeCode();
      /**
       * 设置实体唯一的短名称标识，抽象继承的时候使用
       */
      void setTypeCode(String typeCode);
      /**
       * 获取实体的所有自有属性
       */
      MetadataList<IPropertyInfo> getProperties();// { get; }


      /**
       * 获取指定名称的包含基类属性
       */
      IPropertyInfo get(String propertyName);

      /**
       * 获取实体的所有属性(包含继承得到属性)
       * @return
       */
      IPropertyInfo[] GetAllProperties();

      /// <summary>
      /// 根据实体属性的扩展属性（ExtendData）查找实体属性
      /// </summary>
      /// <param name="key">扩展属性的名称</param>
      /// <param name="value">扩展属性的值，如果为null表过不比较值</param>
      /// <returns></returns>
      /**
       * 根据实体属性的扩展属性（ExtendData）查找实体属性
       * 
       */
      IPropertyInfo FindByExtendMap(String key, String value);

      /// <summary>
      /// 根据实体属性的扩展属性（ExtendData）查找实体属性
      /// </summary>
      /// <param name="key">扩展属性的名称</param>
      /// <returns>只要找到key相同的扩展属性</returns>
      /**
       * 根据实体属性的扩展属性（ExtendData）查找实体属性
       * 只要找到key相同的扩展属性
       */
      IPropertyInfo FindByExtendMap(String key);


      /// <summary>
      /// 获取一个值表示给定的实体类型的实体是否是可以分配给当前实体类型的引用。
      /// </summary>
      /// <param name="entity">要判断是否是其类型的实体</param>
      /// <returns></returns>
      /// <remarks>非持久化实体只有给定类型等于当前类型的时候才为true;持久化实体的判断参见CLR Type类的IsAssignableFrom方法</remarks>
      /**
       * 获取一个值表示给定的实体类型的实体是否是可以分配给当前实体类型的引用。
       */
      boolean IsAssignableFrom(IEntityInfo entity);
}
